cssvalue: Add _gtk_css_value_equal()
authorBenjamin Otte <otte@redhat.com>
Mon, 26 Mar 2012 23:43:12 +0000 (01:43 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 17 Apr 2012 06:59:12 +0000 (08:59 +0200)
For now, we return FALSE for all default css values, so this is not very
useful.

I also think of this as an optimization equal, not a guaranteed equal,
because we don't even have a notion of what "equal" means.

For example, for background-repeat, "repeat, repeat" and "repeat"
are functionally equivalent. But the cssvalue has no idea that it's used
for background-repeat.
As a more complicated example, "repeat, no-repeat" and "repeat" are
equal to what one sees as long as there's only one image listed
background-image-source. But once you start transition'ing to an image
with 2 sources, it's different...

gtk/gtkcssarrayvalue.c
gtk/gtkcssinheritvalue.c
gtk/gtkcssinitialvalue.c
gtk/gtkcssstyleproperty.c
gtk/gtkcssvalue.c
gtk/gtkcssvalueprivate.h

index ba919da45e903a59f8f35fc332b9530b8b874a43..922fdfdeda884ae97d4cea331d8de36bfc98c85d 100644 (file)
@@ -40,6 +40,25 @@ gtk_css_value_array_free (GtkCssValue *value)
   g_slice_free1 (sizeof (GtkCssValue) + sizeof (GtkCssValue *) * (value->n_values - 1), value);
 }
 
+static gboolean
+gtk_css_value_array_equal (const GtkCssValue *value1,
+                           const GtkCssValue *value2)
+{
+  guint i;
+
+  if (value1->n_values != value2->n_values)
+    return FALSE;
+
+  for (i = 0; i < value1->n_values; i++)
+    {
+      if (!_gtk_css_value_equal (value1->values[i],
+                                 value2->values[i]))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static void
 gtk_css_value_array_print (const GtkCssValue *value,
                            GString           *string)
@@ -62,6 +81,7 @@ gtk_css_value_array_print (const GtkCssValue *value,
 
 static const GtkCssValueClass GTK_CSS_VALUE_ARRAY = {
   gtk_css_value_array_free,
+  gtk_css_value_array_equal,
   gtk_css_value_array_print
 };
 
index 99405bbb874fdc2b0f2317f7860dd85fb7c63fc5..427f7ec09fd4ccfddd92e11e1197383e7cb30cc9 100644 (file)
@@ -30,6 +30,13 @@ gtk_css_value_inherit_free (GtkCssValue *value)
   g_assert_not_reached ();
 }
 
+static gboolean
+gtk_css_value_inherit_equal (const GtkCssValue *value1,
+                             const GtkCssValue *value2)
+{
+  return TRUE;
+}
+
 static void
 gtk_css_value_inherit_print (const GtkCssValue *value,
                              GString           *string)
@@ -39,6 +46,7 @@ gtk_css_value_inherit_print (const GtkCssValue *value,
 
 static const GtkCssValueClass GTK_CSS_VALUE_INHERIT = {
   gtk_css_value_inherit_free,
+  gtk_css_value_inherit_equal,
   gtk_css_value_inherit_print
 };
 
index 32fb1c99fec1b24fcb289136e5dd243f001e93fe..73fd38b3ae2833d9983280d28bdb62ae785c7582 100644 (file)
@@ -30,6 +30,13 @@ gtk_css_value_initial_free (GtkCssValue *value)
   g_assert_not_reached ();
 }
 
+static gboolean
+gtk_css_value_initial_equal (const GtkCssValue *value1,
+                             const GtkCssValue *value2)
+{
+  return TRUE;
+}
+
 static void
 gtk_css_value_initial_print (const GtkCssValue *value,
                              GString           *string)
@@ -39,6 +46,7 @@ gtk_css_value_initial_print (const GtkCssValue *value,
 
 static const GtkCssValueClass GTK_CSS_VALUE_INITIAL = {
   gtk_css_value_initial_free,
+  gtk_css_value_initial_equal,
   gtk_css_value_initial_print
 };
 
index 933dbd47a5781a38c965a62572a889b9d7f522d1..a8bcf2f1ccb3e64b4b7e85d9c8f3877e759d62ed 100644 (file)
@@ -311,7 +311,7 @@ gtk_css_style_property_real_equal (GtkCssStyleProperty *property,
                                    GtkCssValue         *value1,
                                    GtkCssValue         *value2)
 {
-  return FALSE;
+  return _gtk_css_value_equal (value1, value2);
 }
 
 static void
index a797f65534be5a5c1977a4a617ca1afaee2aea1f..be0d71afdb575e872e8f038f5aca1a665f97ca4f 100644 (file)
@@ -79,6 +79,13 @@ gtk_css_value_default_free (GtkCssValue *value)
   g_slice_free (GtkCssValue, value);
 }
 
+static gboolean
+gtk_css_value_default_equal (const GtkCssValue *value1,
+                             const GtkCssValue *value2)
+{
+  return FALSE;
+}
+
 static void
 gtk_css_value_default_print (const GtkCssValue *value,
                              GString           *string)
@@ -92,6 +99,7 @@ gtk_css_value_default_print (const GtkCssValue *value,
 
 static const GtkCssValueClass GTK_CSS_VALUE_DEFAULT = {
   gtk_css_value_default_free,
+  gtk_css_value_default_equal,
   gtk_css_value_default_print
 };
 
@@ -438,6 +446,19 @@ _gtk_css_value_unref (GtkCssValue *value)
   value->class->free (value);
 }
 
+gboolean
+_gtk_css_value_equal (const GtkCssValue *value1,
+                      const GtkCssValue *value2)
+{
+  g_return_val_if_fail (value1 != NULL, FALSE);
+  g_return_val_if_fail (value2 != NULL, FALSE);
+
+  if (value1->class != value2->class)
+    return FALSE;
+
+  return value1->class->equal (value1, value2);
+}
+
 void
 _gtk_css_value_print (const GtkCssValue *value,
                       GString           *string)
index 90517b57464fa991f9578e2e4cd9456207936ff4..c726e18176a579efde0549ebdb846862312e21f5 100644 (file)
@@ -48,6 +48,8 @@ typedef struct _GtkCssValueClass      GtkCssValueClass;
 struct _GtkCssValueClass {
   void          (* free)                              (GtkCssValue                *value);
 
+  gboolean      (* equal)                             (const GtkCssValue          *value1,
+                                                       const GtkCssValue          *value2);
   void          (* print)                             (const GtkCssValue          *value,
                                                        GString                    *string);
 };
@@ -61,6 +63,9 @@ GtkCssValue *_gtk_css_value_alloc                     (const GtkCssValueClass
 GtkCssValue *_gtk_css_value_ref                       (GtkCssValue                *value);
 void         _gtk_css_value_unref                     (GtkCssValue                *value);
 
+gboolean     _gtk_css_value_equal                     (const GtkCssValue          *value1,
+                                                       const GtkCssValue          *value2);
+
 void         _gtk_css_value_print                     (const GtkCssValue          *value,
                                                        GString                    *string);